package cn.itcast.nems.order.web.vo;

import cn.itcast.nems.studentrecord.enumeration.FundFlowPaymentTypeEnum;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Past;
import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 
 * 支付结果-明细/行
 *
 * @author 刘曙
 *
 * @version 
 *
 * @since 2023年9月17日
 */
@Data
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class PaymentResultLineNotifyVO implements Serializable {
    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = -6585527168267364307L;
    
    /** 支付类型：在线支付|ONLINE、离线支付|OFFLINE */
    @NotBlank(message = "支付单类型不能为空！！")
    private String journalType = FundFlowPaymentTypeEnum.ONLINE_PAY.name();
    
    /** 支付单号：在线支付为支付平台单号，离线支付为离线支付单号 */
    @NotBlank(message = "支付单号不能为空！")
    private String journalNo;
    
    /** 支付金额 */
    @NotNull(message = "支付金额不能为空！")
    @Min(value = 1, message = "支付金额必须大于零！")
    private Integer amount;
    
    /** 支付手续费金额 */
    private Integer charge;
    
    /** 支付手续费费率 */
    private BigDecimal chargeRate;
    
    /** 币种 */
    private String currency = "CNY";
    
    /** 支付时间 */
    @NotNull(message = "支付时间不能为空！")
    @Past(message = "支付时间不正确！")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    private LocalDateTime payTime;

    /** 支付方式CODE */
    @NotBlank(message = "支付方式CODE不能为空！")
    private String payMethodCode;
    
    /** 支付方式名称*/
    @NotBlank(message = "支付方式名称不能为空！")
    private String payMethodName;
    
    /** 支付渠道账号Code */
    private String payMethodAccountCode;
    
    /** 支付渠道账号名称 */
    private String payMethodAccountName;
    
    /** 支付方式终端：PC，H5，APP，WCOA（微信公众号） */
    @NotBlank(message = "支付方式终端不能为空！")
    private String payTerminal;
    
    /** 支付结果：SUCCESS｜成功、FAIL｜失败 */
    @NotBlank(message = "支付行状态不能为空！")
    private String status;
    
    /** 备注 */
    private String remark;

    /**
     * 创建人email可以为空(仅在补录时有值)
     */
    private String createdBy;
}
